package cn.net.dpi.util;

import com.alibaba.fastjson.JSON;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 对象转化工具类
 *
 * @author DPI199
 * @date   2022/05/25
 */
public final class ConvertUtil {

    private ConvertUtil() {
    }

    /**
     * 对象转化
     *
     * @param source    源目标
     * @param clazz     target
     * @param <S>       类型
     * @param <T>       类型
     * @return  target
     */
    public static <S, T> T convert(S source, Class<T> clazz) {
        return deepConvert(source, clazz);
    }

    /**
     * 对象list转化
     *
     * @param sourceList    源目标
     * @param cls           target
     * @param <S>           类型
     * @param <T>           类型
     * @return  target
     */
    public static <S, T> List<T> convertList(List<S> sourceList, Class<T> cls) {
        if (CollectionUtils.isEmpty(sourceList) || cls == null) {
            // 使用java util 提供的空集合，避免使用 new ArrayList<>() 减少内存开销
            return java.util.Collections.emptyList();
        }
        return sourceList.stream().map(s -> convert(s, cls)).collect(Collectors.toList());
    }

    /**
     * 利用json深拷贝
     *
     * @param source    源目标
     * @param clazz     target
     * @param <S>       类型
     * @param <T>       类型
     * @return  target
     */
    private static <S, T> T deepConvert(S source, Class<T> clazz) {
        if (source == null || clazz == null) {
            return null;
        }
        return JSON.parseObject(JSON.toJSONString(source), clazz);
    }

}
